package org.nobject.common.lang;

import java.lang.reflect.Array;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.Map;


/**
 * 字符串工具
 * 
 * @author bianrongjun
 * @version 1.0
 */
public class StringUtils {
	
	/** 
	 * 是否有以前缀组里的开头
	 * 
	 * @param str 字符串
	 * @param prefixs
	 */
	public static boolean startWiths(String str,String[] prefixs){
		for (String prefix:prefixs) {
			if (str.startsWith(prefix)) return true;
		}
		return false;
	}
	
	/**
	 * 截取指定长度的字符,如果超出最大长度返回最大长度
	 * 
	 * @param str 字符串
	 * @param length 截取长度
	 */
	public static String substr(String str,int length){
		return (str.length()>=length)?str.substring(0,length):str;
	}
	
	/**
	 * 截取指定长度的字符,如果超出最大长度返回最大长度+补长字串
	 * @param str 字串
	 * @param length 长度
	 * @param longerSign 补长字串
	 */
	public static String substr(String str,int length,String longerSign){
		return (str.length()>length)?str.substring(0,length)+longerSign:str;
	}
	
	/** 
	 * 截取中间到末尾指定长度的字符
	 * @param str 字符串
	 * @param idx 中间坐标
	 */
	public static String substrM2E(String str,int idx){
		return (idx <=str.length())?str.substring(idx,str.length()):str;
	}
	
	/**
	 * 获取重复的字符串
	 * <p>
	 * exp:<br>
	 * 1.getRepeatStrs("_",3) "___"<br>
	 * 2.getRepeatStrs("01",4) "01010101"<br>
	 * 3.getRepeatStrs(null,2) ""<br>
	 * 4.getRepeatStrs(null,0) ""<br>
	 * 
	 * @param repaetStr 重复的字符串
	 * @param repeatCount 重复数量
	 * 
	 */
	public static String getRepeatStrs(String repaetStr, int repeatCount) {
		if (repeatCount <= 0) return "";
		StringBuffer sb = new StringBuffer();
		for (int i = 0; i < repeatCount; i++) sb.append(repaetStr);
		return sb.toString();
	}

	/**
	 * 是否有空
	 * <p>
	 * exp:<br>
	 * 1.isBlank(null,"11","b") true<br>
	 * 2.isBlank("","11","b") true<br>
	 * 
	 * @param strs 字符串组
	 * 
	 * @return 全不为空返回false,否则返回true
	 */
	public static boolean isEmpty(String... strs) {
		if (strs == null) return true;
		for (int i = 0; i < strs.length; i++) {
			if (isEmpty(strs[i])) return true;
		}
		return false;
	}

	/**
	 * 是否为空<br>
	 * 可鉴别Tab键，换行键
	 * 
	 * @param str 字符串
	 */
	public static boolean isEmpty(String str) {
		int strLen;
		if (str == null || (strLen = str.length()) == 0) return true;
		for (int i = 0; i < strLen; i++) {
			if ((Character.isWhitespace(str.charAt(i)) == false)) return false;
		}
		return true;
	}
	
	/** 
	 * 空值转默认值
	 * @param source 原串
	 * @param defValue 默认值
	 */
	public static String e2d(String source,String defValue){
		return isEmpty(source)?defValue:source;
	}
	
	/** 
	 * 空值转默认值
	 * @param source 原串
	 * @param defValue 默认值
	 */
	public static boolean e2d(String source,boolean defValue){
		return StringUtils.isEmpty(source)?defValue:Boolean.valueOf(source);
	}
	
	/******************************************************************************************************************
	 * 
	 *  toString 区域
	 * 
	 *******************************************************************************************************************/
	
	/** Character转化为String */
	public static String toString(Character character){return character.toString();}
	/** Number转化为String */
	public static String toString(Number num){return num.toString();}
	/** Boolean转化为String */
	public static String toString(Boolean bool){return bool.toString();}
	/** Date转化为String */
	public static String toString(Date date){return date.toString();}
	/** 转换为String */
	public static String toString(Collection collection) {
		StringBuffer sb = new StringBuffer();
		sb.append("[");
		for (Iterator iter = collection.iterator(); iter.hasNext();) {
			Object o = iter.next();
			if(o!=null) sb.append(toString0(o));
			if (iter.hasNext()) sb.append(",");
		}
		sb.append("]");
		return sb.toString();
	}
	/** Map转化为String */
	public static String toString(Map map) {
		StringBuffer sb = new StringBuffer();
		if(map==null) return null;
		for (Iterator iterator = map.keySet().iterator(); iterator.hasNext();) {
			Object key = iterator.next();
			Object value = map.get(key);
			String strKey=null2Empty(toString0(key));
			String strValue=null2Empty(toString0(value));
			sb.append(strKey).append(":").append(strValue);
			if (iterator.hasNext()) sb.append(",");
		}
		return "{" + sb.toString() + "}";
	}
	/** Class转化为String */
	public static String toString(Class clazz){return clazz.isArray()?clazz.getComponentType().getName()+"[]":clazz.getName();}
	
	//数组转到String系列
	
	/** Object[]转化为String */
	public static String toString(Object[] array){return toStringByArray(array);}
	/** byte[]转化为String */
	public static String toString(byte[] array){return toStringByArray(array);}
	/** int[]转化为String */
	public static String toString(int[] array){return toStringByArray(array);}
	/** short[]转化为String */
	public static String toString(short[] array){return toStringByArray(array);}
	/** long[]转化为String */
	public static String toString(long[] array){return toStringByArray(array);}
	/** float[]转化为String */
	public static String toString(float[] array){return toStringByArray(array);}
	/** double[]转化为String */
	public static String toString(double[] array){return toStringByArray(array);}
	/** char[]转化为String */
	public static String toString(char[] array){return toStringByArray(array);}
	/** boolean[]转化为String */
	public static String toString(boolean[] array){return toStringByArray(array);}
	/** 数组转换为String */
	private static String toStringByArray(Object array){
		StringBuffer sb = new StringBuffer();
		sb.append("[");
		int l=Array.getLength(array);
		for (int i = 0; i < l; i++) {
			if (i!=0) sb.append(",");
			sb.append(toString0(Array.get(array, i)));
		}
		sb.append("]");
		return sb.toString();
	}
	
	/** Object转换为字符串 */
	public static String toString0(Object obj){
		if(obj==null) return "";
		String value=null;
		Class clazz=obj.getClass();
		if(clazz.isArray()){
			value=toStringByArray(obj);
		}else{
			if(ClassUtils.isString(clazz)) value=(String)obj;
			else if(ClassUtils.isChar(clazz)) value=toString((Character)obj);
			else if(ClassUtils.isNumber(clazz)) value=toString((Number)obj);
			else if(ClassUtils.isBoolean(clazz)) value=toString((Boolean)obj);
			else if(ClassUtils.isDate(clazz)) value=toString((Date)obj);
			else if(ClassUtils.isCollection(clazz)) value=toString((Collection)obj);
			else if(ClassUtils.isMap(clazz)) value=toString((Map)obj);
			else if(ClassUtils.isClass(clazz)) value=toString((Class)obj);
			else value=obj.toString();
		}
		return value;
	}
	
	/******************************************************************************************************************
	 * 
	 *  toStrings 区域
	 * 
	 *******************************************************************************************************************/
	
	/** Object[]转换为String[] */
	public static String[] toStrings(Object[] objs){
		String [] ss=new String[objs.length];
		for (int i= 0; i<objs.length;i++) {ss[i]=toString0(objs[i]);}
		return ss;
	}
	/** Collection转换为String[] */
	public static String[] toStrings(Collection collection){
		String [] ss=new String[collection.size()];int i=0;
		for (Iterator iterator = collection.iterator(); iterator.hasNext();) {ss[i]=toString0(iterator.next());i++;}
		return ss;
	}
	
	/**
	 * 转换数字为固定长字符串，用str在前补位
	 * @param num 数字
	 * @param length 数字位数
	 * @param str 补位字符
	 */
	public static String fillEmptyWithStr(int num, int length, String str) {
		return fillEmptyWithStr(Long.valueOf(num), length, str);
	}
	
	/**
	 * 转换数字为固定长字符串，用str在前补位
	 * @param num 数字
	 * @param length 数字位数
	 * @param str 补位字符
	 */
	public static String fillEmptyWithStr(long num, int length, String str) {
		String s = getRepeatStrs(str, length) + num;
		return s.substring(s.length() - length, s.length());
	}
	
	/**
	 * NULL转成空字符串
	 * @param str 字符串
	 */
	public static String null2Empty(String str){
		return (str==null)?"":str;
	}
	
	/** 
	 * 晒出不为空的字符串
	 * @param strs 字符串s
	 */
	public static String notEmpty(String... strs){
		for(String str:strs){
			if(!isEmpty(str)) return str;
		}
		return null;
	}
	
	/** 
	 * 获取不为空的
	 * @param strs
	 */
	public static String getNotEmpty(String... strs){
		for(String str:strs){
			if(!isEmpty(str)) return str;
		}
		return null;
	}
	
	/**
	 * NULL或空转成字符串
	 * @param str 字符串
	 * @param replacement 替换字符串
	 */
	public static String blank2Str(String str,String replacement){
		return isEmpty(str)?replacement:str;
	}
	
	/**
	 * 超出指定长度添加字符串在末尾
	 * @param str
	 * @param length
	 * @param appender
	 */
	public static String overAppend(String str,int length,String appender){
		if(str.length()<=length) return str;
		return str.substring(0,length)+appender;
	}
	
	/** 
	 * 去掉末尾字符串
	 * @param str 字符串
	 * @param endStr 尾串
	 * */
	public static String removeEnd(String str,String endStr){
		int c=str.lastIndexOf(endStr);
		if(c>=0&&c==(str.length()-endStr.length())) return str.substring(0,c);
		return str;
	}
	
	/** 
	 * 去掉首字符串
	 * @param str 字符串
	 * @param startStr 首串
	 */
	public static String removeStart(String str,String startStr){
		return (str.indexOf(startStr)==0)?str.substring(startStr.length()):str;
	}
	
	/** 
	 * 去掉首字符串和未字符串
	 * @param str 字符串
	 * @param startStr 首串
	 * @param endStr 尾串
	 */
	public static String removeStartEnd(String str,String startStr,String endStr){
		return removeEnd(removeStart(str, startStr), endStr);
	}
	
	/** 
	 * 是否以指定字符结尾
	 * @param str
	 * @param end
	 */
	public static boolean endWithIgnoreCase(String str,String end){
		if(str.length()<end.length()) return false;
		return str.substring(str.length()-end.length()).equalsIgnoreCase(end);
	}
	
	/** 
	 * 是否以指定字符开始
	 * @param str
	 * @param end
	 */
	public static boolean startWithIgnoreCase(String str,String start){
		if(str.length()<start.length()) return false;
		return str.substring(0,start.length()).equalsIgnoreCase(start);
	}
	
	/** 
	 * 是否在其中
	 * @param src 字符串
	 * @param ranges 检测范围
	 * @param ignoreCase 是否忽略大小写
	 */
	public static boolean byContain(String src,String[] ranges,boolean ignoreCase){
		if(src==null||ranges==null) return false;
		for(String range:ranges){
			if(ignoreCase){
				if(src.equalsIgnoreCase(range)) return true;
			}else{
				if(src.equals(range)) return true;
			}
		}
		return false;
	}
	
	/** 
	 * 是否在其中
	 * @param src
	 * @param ranges
	 */
	public static boolean byContain(String src,String[] ranges){
		return byContain(src, ranges,false);
	}
}
